//? JavaScript中的管道函数指的是将一个值作为输入，通过一系列的函数处理，最终得到输出结果的技术。
//? 在JavaScript中，可以使用管道函数库如Ramda和Lodash/fp等来实现管道函数
//?管道函数:即一个函数调用另一个函数的结果 pipe(func,func, func)(arg) 相当于 c(b(a(1)))
//? 故调用pipe函数时返回的必须是函数 才能继续()调用 这个返回函数里需要用到上一个函数结果(也就是这个函数里有需要用到函数的连续调用)

//? 可进行多值传递版
function pipe2(...args1){
    return function(...args2){
        if(args1.length === 0) return;
        if(args1.length === 1) return args1[0](...args2);
        //? 两个及以上的参数(函数)个数 通过reduce整合成一个管道函数(这也是reduce的一个应用了)
        return args1.reduce((a, b) => function() {
            return b(a(...args2))
        })()
    }
}
function sayHi(num) {
    console.log("hi!",num);
    return num + 2
}
function sayHello(num) {
    console.log("hello!",num);
}
function sayBye(num) {
    console.log("bye!",num);
    return num + 5
}
console.log(pipe2(sayHi,sayBye, sayHello)(3));
//? 符合管道函数定义的版本(即只传一个值)
function myPipe(...fns) {
    return function (value) {
        //? reduce里的callback参数:累加器、当前元素
        return fns.reduce((acc, fn) => {
            return fn(acc);
        }, value);
    };
}
// 用于测试的示例函数
function addOne(x) {
    return x + 1;
}
function double(x) {
    return x * 2;
}
function minusTen(x) {
    return x - 10;
}
const result = myPipe(addOne, double, minusTen)(5);
console.log(result);
